<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // BigInt 数据类型

    // 起源:JavaScript 所有数字都保存成 64 位浮点数，这给数值的表示带来了两大限制。一是数值的精度只能到 53 个二进制位（相当于 16 个十进制位），大于这个范围的整数，JavaScript 是无法精确表示，这使得 JavaScript 不适合进行科学和金融方面的精确计算。二是大于或等于2的1024次方的数值，JavaScript 无法表示，会返回Infinity。

    // 1.  超出 2^53次方的数无法精准表示
    // 2.  超出 2^1024次方的数无法表示 => 会返回Infinity

    // ES2020 引入了一种新的数据类型 BigInt（大整数），来解决这个问题，这是 ECMAScript 的第八种数据类型。BigInt 只用来表示整数，没有位数的限制，任何位数的整数都可以精确表示。

    // 如何创建BigInt数据?
    // 1. 字面量创建
    // var a = 1234567;  // number
    // var b = 1234567n; // BigInt
    // console.log(a, typeof a);
    // console.log(b, typeof b);


    // 2. BigInt函数 => JavaScript 原生提供BigInt函数，可以用它生成 BigInt 类型的数值。转换规则基本与Number()一致，将其他类型的值转为 BigInt。
    // var a = 1234567;
    // var b = BigInt(a);
    // console.log(a, typeof a);
    // console.log(b, typeof b);


    // 解决问题

    console.log(2 ** 53, 2 ** 53 + 1);
    console.log(2n ** 53n, 2n ** 53n + 1n);  // 1. 同类型运算  2. BigInt不能使用Math.pow()

    // console.log(Math.pow(2n, 53n));  // 报错: Cannot convert a BigInt value to a number

    console.log(2 ** 1024, 2 ** 1024 + 1);
    console.log(2n ** 1024n, 2n ** 1024n + 1n);  // 1. 同类型运算  2. BigInt不能使用Math.pow()

    document.write(2n ** 1024n);
    document.write("<br>")
    document.write(2n ** 1024n + 1n);





</script>

</html>